package com.cs.deviceManager.listener;

import com.cs.deviceManager.device.DeviceEventListener;
import com.cs.deviceManager.mqtt.MqttUtil;
import com.cs.deviceManager.service.IDevDeviceCommandService;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 设备活跃事件监听器
 * 专门处理设备激活、超时等设备事件
 * 实现DeviceEventListener接口，接收来自DeviceEventMessageHandler的事件通知
 *
 * @author zizige
 * @date 2025-06-30
 */
@Component
public class DeviceActiveEventListener implements DeviceEventListener {
    private static final Logger log = LoggerFactory.getLogger(DeviceActiveEventListener.class);

    @Resource
    private IDevDeviceCommandService devDeviceCommandService;

    /**
     * 处理设备连接事件
     * 当设备连接时，标记设备为活跃状态并下发待执行指令
     *
     * @param deviceId 设备ID
     */
    @Override
    public void onDeviceConnected(String deviceId) {
        log.info("设备已连接: deviceId={}", deviceId);
        try {
            // 标记设备为活跃状态并下发待执行指令
            devDeviceCommandService.markDeviceActive(deviceId);
            // 刷新设备心跳
            MqttUtil.reportHeartbeat(deviceId, null);
        } catch (Exception e) {
            log.error("处理设备连接事件失败: deviceId={}", deviceId, e);
        }
    }

    /**
     * 处理设备恢复事件
     * 当设备断线重连时触发
     *
     * @param deviceId 设备ID
     * @param data     设备恢复数据
     */
    @Override
    public void onDeviceRecovered(String deviceId, String data) {
        log.info("设备已恢复: deviceId={}, data={}", deviceId, data);
        try {
            // 标记设备为活跃状态
            devDeviceCommandService.markDeviceActive(deviceId);
            // 刷新设备心跳
            MqttUtil.reportHeartbeat(deviceId, null);
        } catch (Exception e) {
            log.error("处理设备恢复事件失败: deviceId={}", deviceId, e);
        }
    }

    /**
     * 处理设备断开连接事件
     * 当设备断开连接时，处理连接断开逻辑
     *
     * @param deviceId 设备ID
     */
    @Override
    public void onDeviceDisconnected(String deviceId) {
        log.warn("设备连接断开: deviceId={}", deviceId);
        try {
            // 调用DevDeviceCommandServiceImpl中的方法处理连接断开
            devDeviceCommandService.handleConnectionLost(deviceId);
        } catch (Exception e) {
            log.error("处理设备断开连接事件失败: deviceId={}", deviceId, e);
        }
    }

    /**
     * 处理设备遥测数据
     * 更新设备活跃状态
     *
     * @param deviceId 设备ID
     * @param data     遥测数据
     */
    @Override
    public void onDeviceTelemetry(String deviceId, String data) {
        try {
            // 处理设备数据，更新指令状态
            devDeviceCommandService.handleDeviceData(deviceId, data);
            // 刷新设备心跳
            MqttUtil.reportHeartbeat(deviceId, null);
        } catch (Exception e) {
            log.error("处理设备遥测数据失败: deviceId={}", deviceId, e);
        }
    }

    /**
     * 处理设备异常上报
     *
     * @param deviceId     设备ID
     * @param abnormality 异常类型
     */
    @Override
    public void onDeviceAbnormality(String deviceId, String abnormality) {
        log.warn("设备异常: deviceId={}, 异常信息={}", deviceId, abnormality);
        // 可以添加异常处理逻辑，如记录日志、触发告警等
    }

    /**
     * 处理设备文本上报
     *
     * @param deviceId 设备ID
     * @param text     文本数据
     */
    @Override
    public void onDeviceText(String deviceId, String text) {
        // 默认不处理
        log.debug("接收到设备文本消息: deviceId={}, text={}", deviceId, text);
    }

    /**
     * 处理设备二进制数据上报
     *
     * @param deviceId 设备ID
     * @param data     二进制数据
     */
    @Override
    public void onDeviceBinary(String deviceId, byte[] data) {
        // 默认不处理，由专门的OTA监听器处理
        log.debug("接收到设备二进制数据: deviceId={}", deviceId);
    }
}